package com.example.concurrency.day2;

public class SynchronizedDemo implements Runnable{
    int x = 100;

    public synchronized void m1() {
        x = 1000;
        try {
            Thread.sleep(1000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println("x=" + x);
    }

    public synchronized void m2() {
        try {
            Thread.sleep(200);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        x = 2000;
    }
    public static void main(String[] args) throws InterruptedException {
        SynchronizedDemo sd = new SynchronizedDemo();
        //非静态方法的synchronized关键字锁的是实例对象,一下所有操作都是竞争的sd 这同一把锁
        new Thread(()->sd.m1()).start();//由于这里是直接start()所以是这个线程先拿到锁, 如果修改一下 两个线程都创建完在同时start()则两个线程随机先执行拿到锁
        new Thread(()->sd.m2()).start();//由于第一个线程先执行 所以先输出x=1000,后释放锁 第二个子线程和主线程同时竞争锁 但是修改的操作一致 ,所以不论哪个线程先拿到锁 不改变程序结果
        sd.m2();
        System.out.println("Main x=" + sd.x);
        //x=1000
        //Main x=2000
    }
    @Override
    public void run() {
        m1();
    }
}